package sao.controlador;

import java.io.IOException;
import java.sql.SQLException;
import java.text.DateFormat;
import java.util.Date;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import sao.dao.Dao;
import sao.modelo.Usuario;
import sao.visao.GeradorMenu;

@SuppressWarnings("serial")
public class LoginController extends HttpServlet {
	
	public void doGet(HttpServletRequest request, HttpServletResponse response) {
		this.doPost(request, response);
	}
	
	public void doPost(HttpServletRequest request, HttpServletResponse response) {
		// Captura ou inicia uma nova sessão
		HttpSession sessao = request.getSession();
		// Captura os dados do usuário que tenta se logar
		String login = request.getParameter("login");
		String senha = request.getParameter("senha");
		// Instancia o Data Access Object
		Dao dao = new Dao();
		Usuario usuario;
		try {
			usuario = dao.getUsuario(login, senha);
			if ( usuario != null ) {// Usuário autenticado com sucesso
				sessao.setAttribute("usuario", usuario); // Anexa usuário à sessão
				Boolean autenticado = new Boolean(true); // Seta variável de autenticação
				sessao.setAttribute("autenticado", autenticado);
				getServletContext().setAttribute("dataCorrente", getDataExibicao());
				// Gera o menu com as operações permitidas
				GeradorMenu gm = new GeradorMenu(usuario.getPerfil());
				String menu = gm.getHTMLMenu();
				sessao.setAttribute("menu", menu);
				// Envia o usuário à página inicial do sistema
				despachaUsuario(request, response, "inicial.jsp");
			} else {// Usuário não conseguiu autenticar
				sessao.invalidate();
				request.setAttribute("mensagemErro", "ERRO: Usuário ou senha inválida");
				despachaUsuario(request, response, "login.jsp");
			}
		} catch (NumberFormatException e) {
			// TODO Configurar página de erro para estas exceções
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}

	

	/**
	 * Envia o usuário a alguma página, dependendo se sua autenticação
	 * foi ou não aceita
	 * @param request
	 * @param response
	 * @param pagina
	 */
	private void despachaUsuario(HttpServletRequest request,
			HttpServletResponse response, String pagina) {
		RequestDispatcher view = request.getRequestDispatcher(pagina);
		try {
			view.forward(request, response);
		} catch (ServletException e) {
			//TODO Configurar página de erro para esta exceções
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}//FIM método despachaUsuario

	
	
	/**
	 * Gera a data corrente para exibição nas páginas
	 * @return
	 */
	private String getDataExibicao() {
		DateFormat df = DateFormat.getDateInstance(DateFormat.FULL);
		return df.format(new Date());
	}
	
	
}//FIM classe LoginController
